package tsb.sax;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

/**
 *
 * Lector de bajo nivel que sabe separar las partes de un xml
 */
public class XMLReader {
    private File file;
    private BufferedReader reader;
    private boolean eof;

    public XMLReader(String path) throws FileNotFoundException{
        this(new File(path));
    }

    public XMLReader(File xmlFile) throws FileNotFoundException {
        this.file = xmlFile;
        this.reader = new BufferedReader(new FileReader(file));
        this.eof = false;
    }

    public boolean eof() {
        return this.eof;
    }

    public boolean close() {
        boolean resultado = true;

        try {
            reader.close();
        } catch (IOException ex) {
            resultado = false;
        } finally {
            return resultado;
        }
    }

    public char getChar() throws IOException{
        return (char) reader.read();
    }

    public String getNext() {
        String resultado = "";
        int i = 0;
        char ch0 = (char) -1;
        char ch1 = (char) -1;
        
        try {

            do {
                i = reader.read();
                ch0 = (char) i;
            } while (i != -1 && (String.valueOf("\n").charAt(0) == ch0
                              || String.valueOf("\t").charAt(0) == ch0
                              || String.valueOf(" ").charAt(0)  == ch0
                              || String.valueOf("\r").charAt(0) == ch0));

            resultado = resultado + String.valueOf(ch0) + omitirCaracteres(ch0);
            boolean esFinal = false;

            do {
                switch (ch0) {
                    case '<':
                        i = reader.read();
                        ch1 = (char) i;
                        resultado = resultado + String.valueOf(ch1) + omitirCaracteres(ch1);
                        esFinal = (ch1 == '>' || resultado.equals("<!DOCTYPE "));
                        reader.mark(1);
                        break;
                    default:
                        reader.mark(1);
                        i = reader.read();
                        ch1 = (char) i;
                        if (ch1 != '<') {
                            resultado = resultado + String.valueOf(ch1) + omitirCaracteres(ch1);
                        } else {
                            esFinal = true;
                        }
                        break;
                }
            } while (!esFinal && i != -1 && eof == false);

            this.resetMarcas();

        } catch (Exception ex) {
        } finally {
            if (i == -1) {
                this.eof = true;
                resultado = null;
            }
            if (resultado != null) {
                resultado = resultado.trim();
            }
            return resultado;
        }
    }

    /* **********************************
     * METODOS DE SOPORTE
     ************************************/
    private void resetMarcas() {
        try {
            reader.reset();
        } catch (IOException ex) {
        }
    }

    private String omitirCaracteres(char c0) throws IOException {
        String resultado = "";
        int i = 0;
        boolean esFinal = false;

        if (c0 == '"' && i == -1) {
            i = reader.read();

            while (eof == false && esFinal == false) {
                char c1 = (char) i;
                resultado += String.valueOf(c1);
                if (c1 != '"') {
                    i = reader.read();
                }
                else {
                    esFinal = true;
                }
                if (i == -1) {
                    eof = true;
                }
            }
        }
        return resultado;
    }
}